package day2;

import java.io.ObjectInputStream.GetField;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.InputMismatchException;
import java.util.Scanner;

public class Test1 {

	public static void main(String[] args) {
		//主函数
		int yearAndMonth = getYearAndMonth();
		System.out.println("获取的年或者年月是："+yearAndMonth);
		
		//打印全年的日历
		printCalendar(yearAndMonth);
		

	}
	private static void printCalendar(int yearAndMonth) {
		// TODO Auto-generated method stub
		//按照每月打印
		for(int month = 1;month<=12;month++){
			String year = (yearAndMonth + "").substring(0,4);
			System.out.println(year);
			printMonth(new Integer(year),month);
		}
		
	}
	private static void printMonth(Integer year,int month) {
		// TODO Auto-generated method stub
		System.out.println("当前是："+ month +"月");
		System.out.println("一\t二\t三\t四\t五\t六\t日");
		//只有4 6 9 11是30天，2月份根据年份来决定，其他月份是31天
		int weekDay = getweekDay(year,month);
		for(int day = 1;day<=31;day++){
			if(day == 1){
				for(int t=1;t<=weekDay;t++){
					System.out.print("\t");
				}
			}
			System.out.print(day+"\t");
			if((day+weekDay) %7 == 0)System.out.println();
		}
		System.out.println();
		
	}
	/**
	 * 计算每月1号是星期几 时间从1900计算 
	 * @param year
	 * @param month
	 */
	private static int getweekDay(int year, int month) {
		// TODO Auto-generated method stub
		//保存的总天数
		int totals = 0;
		for(int y = 1900;y<=year-1;y++){
			totals= totals + (isLeaf(y)? 366 : 365);
		}
		for(int m =1; m<= month-1;m++){
			totals = totals + getMonthOfDay(year, m);
			
		}
		return totals %7;
		
	}
	private static int getMonthOfDay(int year, int month){
		int days = 31;
		if(month==4||month==6||month==9||month==11){
			days = 30;
		}else if(month == 2){
			days = isLeaf(year)?29 : 28;
		}
		return days;
	}
	private static boolean isLeaf(int year){
		if(year %4==0&&year%100 !=0){
			return true;
		}else if(year%400 == 0){
			return true;

		}
		else{
			return false;

		}
	}
	/**
	 * 负责获取输入的年或者年月
	 * 1.如果输入的格式错误，输入不是数字，出现错误之后，应该可以继续获取数据
	 * @return
	 */
	private static int getYearAndMonth(){
		
		boolean flag = true;
		int yearAndMonth = 1900;//从1900年开始
		do {
			System.out.println("输入4位年或者年月（8位）：");
			
			try{
				Scanner input = new Scanner(System.in);
				yearAndMonth = input.nextInt();
				//如果输入的数据是正常，需要跳出循环
				//todo 判断是否是年月日的格式，还是只有年的格式
				if((yearAndMonth+ "").length() ==8){
					//8位数字 但是8位的数字需要转换成日期
					SimpleDateFormat sdf = new SimpleDateFormat( "yyyyMMdd");
							
				    try{
				    	java.util.Date date =  sdf.parse(yearAndMonth+"");//如果输入的20200936,直接转成10月1号
				    	System.out.println(date);
				    }catch(Exception e){
				    	System.out.println("输入数据不合要求，请重新输入");
				    	continue;//继续循环
				    }
				}else if((yearAndMonth+ "").length() ==4){
					//4位数字
				}else{
					//数据不合要求
					System.out.println("输入数据不合要求，请重新输入");
					continue;//继续循环
				}
				break;
				//flag = false;
			}catch(InputMismatchException e){
				//异常处理
				System.out.println("输入错误，请重新输入");
			}
		}while (flag);
		
		return yearAndMonth;//输入的数据是数字，但是位数不满足，不是一个合法的日期格式数据，也是需要重新输入
	}
	
}
